package org.gridlab.gridsphere.services.visualization;
import org.jfree.chart.*;
import org.jfree.data.general.*;
import org.jfree.util.TableOrder;
import org.jfree.data.xy.*;
import org.jfree.chart.plot.*;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.util.Rotation;
import javax.portlet.*;
import java.util.Map;
import java.util.HashMap;
import java.io.IOException;


/**
 * Klasa abstrakcyjna dla wykresów o osiach XY
 * @author Krzysztof Goj
 */
public abstract class XYChartGenerator extends ImageChartGenerator {
    /**
     * Tworzy nowy obiekt typu XYChartGenerator
     * @param dp DataProvider z danymi dla tego typu wykresu
     * @param c Kontekst portletu
     */
    public XYChartGenerator(DataProvider dp, PortletContext c) {
        super(dp, c);
    }

    /**
     * Zwraca typ danych wymagany przez ten ChartGenerator
     * @return Typ danych wymagany przez ten ChartGenerator czyli Double[][].class
     */
    protected Class dataType() {
        return Double[][].class;
    }

    /**
     * Sprawdza czy dostarczone dane są poprawne
     * @throws org.gridlab.gridsphere.services.visualization.ChartGeneratorException 
     */
    protected void checkData() throws ChartGeneratorException {
        super.checkData();
        for(int i=0; i<dataProvider.getSeriesCount(); ++i) {
            Double[][] data = (Double[][]) dataProvider.getData(i);
            for(int j=0; j<data.length; ++j)
                if(data[j].length != 2)
                    throw new ChartGeneratorException("Data series must be array of 2-Double arrays");
        }
    }

    /**
     * Wywołuje JFreeChart w celu wygenerowania wykresu
     * @param dataset Dane, z których ma być wygenerowany wykres
     */
    abstract void finalTouchWithJFCStuff(XYSeriesCollection dataset);
    /**
     * Przygotowuje dane dla JFreeChart na podstawie danych DataProvidera
     * @throws org.gridlab.gridsphere.services.visualization.ChartGeneratorException 
     */
    protected void doJFreeChartStuff() throws ChartGeneratorException {
         XYSeriesCollection dataset = new XYSeriesCollection();

        for(int i=0; i<dataProvider.getSeriesCount(); ++i) {
            XYSeries series = new XYSeries(dataProvider.getSeriesName(i));
            Double[][] dpData = (Double[][])dataProvider.getData(i);
            for(int j=0; j<dpData.length; ++j)
                series.add(dpData[j][0].doubleValue(), dpData[j][1].doubleValue());
            dataset.addSeries(series);
        }
        finalTouchWithJFCStuff(dataset);
    }
}


